//
//  StatusListViewModel.swift
//  Weibo10
//
//  Created by 刘俊 on 15/10/20.
//  Copyright © 2015年 itheima. All rights reserved.
//

import UIKit
import SDWebImage

/// 微博数据列表模型 -- 封装网络方法
class StatusListViewModel {
    /// 微博数据数组 - 上拉/下拉刷新
    lazy var statusList = [StatusViewModel]()
    
    /// 加载网络数据
    func loadStatus(isPullData isPullData: Bool,finished: (isSuccessed: Bool)->()) {
//        let since_id = statusList[0].status.id //注意如果数组可能为空时,要用系统提供的获取数组元素的方式获取数据
        let since_id = isPullData ? 0 : (statusList.first?.status.id ?? 0)
        let max_id = isPullData ? (statusList.last?.status.id ?? 0) : 0
        NetworkTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id) { (result, error) -> () in
            if error != nil {
                print("微博数据出错了")
                
                finished(isSuccessed: false)
                return
            }
            // 判断 result 的数据结构是否可取
            guard let array = result?["statuses"] as? [[String: AnyObject]] else {
                print("获取到的网络数据出错了")
                
                finished(isSuccessed: false)
                return
            }
            // 解析从网络上获取的数据,放入微博数据模型中
            var dataList = [StatusViewModel]() // 临时存放模型的数组
            for dict in array {
                dataList.append(StatusViewModel(status: SYLJStatus(dict: dict)))
//                // 字典转模型
//                print(dict)
//                let status = SYLJStatus(dict: dict)
//                // 初始化微博数据模型
//                let statusViewModel = StatusViewModel(status: status)
//                // 加入到数组中
//                dataList.append(statusViewModel)
            }
            // 将遍历获得的数据加入到微博数据数组属性中
            if isPullData {
                self.statusList += dataList
            }else {
                self.statusList = dataList + self.statusList
            }
            print("刷新到\(dataList.count)条数据")
            // 将服务器获得单图做本地缓存
            self.cacheSingleImage(dataList,finished: finished)
            }
        }
    private func cacheSingleImage(viewModel: [StatusViewModel],finished: (isSuccessed: Bool)->()) {
        // 遍历视图模型数组
        print("王晓晨")
        var lenth = 0
        // 创建调度组
        let group = dispatch_group_create()
        for vm in viewModel {
            // 判断视图模型中图片是不是一张
            if vm.thumbnailUrls?.count != 1 {
                continue //需要遍历完整个数组
            }
            
            // 获取单张图片的url 
            let url = vm.thumbnailUrls![0]
            // 下载单张图片
            // 将下载图片加入到调度组
            dispatch_group_enter(group)
            SDWebImageManager.sharedManager().downloadImageWithURL(url, options: [], progress: nil, completed: { (image, _, _, _, _) -> Void in
                // 在实际开发中我们需要判断图片的大小来判断是否将图片存入到本地
                if let image = image, //图片不为空,可能为空是因为传入URL时写错
                    let data = UIImagePNGRepresentation(image) { // 判断图片是否转化为了二进制数据
                       lenth += data.length
                }
                // 出调度组
                dispatch_group_leave(group)
            })
        }
        // 这里需要等到所有的图片都缓存到本地后再做处理
        // 监听调度组
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("\(lenth/1024)K")
            // 在此处需要告诉tableview刷新数据
            // 完成回调
            finished(isSuccessed: true)
        }
        
    }

    
}